﻿#pragma once
#ifndef Server_hpp
#define Server_hpp

#include<string>
#include<memory>
#include<functional>
#include<atomic>
#include<thread>
#include<stdint.h>
#include<functional>
#include<atomic>
#include<boost/asio.hpp>
#include<boost/system/detail/error_code.hpp>
#include"./NetworkDef.hpp"
#include"./Session.hpp"

namespace MMFNetwork
{

    using ServerErrorHandler = std::function<void(Server* server, boost::system::error_code err)>;

    class Server
    {

        io_context mService;                            ///< asio上下文
        std::shared_ptr<ip::tcp::acceptor> mAcceptor;   ///< 接收器，用于接收来接请求
        std::shared_ptr<std::thread> mWorker;           ///< 子线程用于运行io_context
        uint16_t mPort;                                 ///< 端口号
        std::string mIp;                                ///< ip地址

        //服务错误处理
        ServerErrorHandler  mServerErrirHandler;        ///< 服务错误处理

        //以下用于创建session时使用
        uint32_t mBufferSize;                               ///< 接收缓存大小
        SessionErrorHandler mErrorHandler;                  ///< 错误处理
        SessionStatusHandler mStatusHandler;                ///< 状态处理
        SessionPackageHandler mPkgHanlder;                  ///< 数据包处理
        SessionConnectHandler mSessionConnectHandler;       ///< 客户端链接回调

        std::atomic<bool> mIsStop;

    public:

        Server(
            uint16_t port,
            uint32_t bufferSize,
            const ServerErrorHandler& serverErrorHandler,
            const SessionErrorHandler& errorHandler,
            const SessionStatusHandler& statusHandler,
            const SessionPackageHandler& pkgHanlder,
            const SessionConnectHandler& sessionConnectHandler,
            const std::string& ip
        );

        ~Server();

        io_context& Context();

        void Start();
        void Stop();

        void StartAccept();
    };

}

#endif